package com.jackwei.leetcode.t1dt10;

/**
 * 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转。
 *
 * 示例1:
 *
 * 输入: 123
 * 输出: 321
 *
 * 示例 2:
 *
 * 输入: -123
 * 输出: -321
 * 示例 3:
 *
 * 输入: 120
 * 输出: 21
 * 注意:
 *
 * 假设我们的环境只能存储得下 32 位的有符号整数，则其数值范围为[−2^31, 2^31− 1]。
 * 请根据这个假设，如果反转后整数溢出那么就返回 0。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/reverse-integer
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class L0007 {
    public static void main(String[] args) {
        int[] nums = {123, -123, 123456000,123456789, 888999000,-78912300, -1239870089};
        for (int num :nums) {
            System.out.println(new L0007().reverse(num));
        }
    }

    /**
     * 思路：倒着取每一位数字，然后一直*10进行扩大存储。然后原数字依次去除最后一位。
     * @param num 原始数字
     * @return 反转后数字
     */
    public int reverse(int num) {
        // 结果存放，必须要大于int，因为反转有溢出问题。
        long result = 0;
        while (num != 0){
            // *10相当于扩大一位   %10相当于取最后一位数字
            result = result*10 + num%10;
            // 相当于去掉数字的最后一位，比如原数123，执行之后变成12
            num /= 10;
        }

        // 看看是不是超过int最大最小值了
        if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
            return 0;
        }

        return (int)result;
    }
}
